home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga News 95
/
Amiga News 95.iso
/
dpat
/
dpat05
/
diskfixer
/
diskfixer.doc
< prev
next >
Wrap
Text File
|
1990-01-17
|
15KB
|
329 lines
D I S K F I X E R
L'utilitaire pour réparer les disquettes que tout le monde attendait!!!
Auteur: Cédric BEUST
L'idée d'écrire un réparateur de disquettes m'est venue après avoir
fait des statistiques sur la cause des Read/Write Errors qui arrivent
quelquefois aux disquettes. La constatation était affligeante: dans plus
de la moitié des cas, les données étaient intactes mais l'AmigaDos
refusait obstinément de les lire sous prétexte que l'un des checksums
était incorrect.
Je me suis donc rebiffé et le résultat est le Disk Fixer.
CE QUE CE PROGRAMME FAIT:
:-) Il répare dans environ 50% des cas (en fait je pense que c'est
plus mais je préfère ne pas trop m'avancer) les disquettes
endommagées avec un taux de rattrapage de 100%
CE QU'IL NE FAIT PAS:
:-{ Des miracles! Si les pistes sont véritablement illisibles, il ne
tentera pas de deviner ce qu'il s'y trouvait avant que le drive
fasse de la gravure sur la disquette. De toutes façons, dans ce
cas, aucun utilitaire ne pourrait récupérer les données perdues.
Contrairement aux utilitaires de réparation couramment répandus
(DiskDoctor, DiskSalv...) qui se contentent de répertorier les pistes
endommagées et de les contourner en ramassant les morceaux, Disk Fixer (df
pour les intimes) essaiera directement de réparer la piste endommagée en
analysant les données brutes (Raw Data). Je vais y revenir. Il ne fait
donc aucune modification de la BitMap, ni de quoi que ce soit concernant
le Dos.
Ce dont vous avez besoin:
- deux drives (une version future pourrait travailler avec un
seul)
- la disquette endommagée dans le drive source
- une copie de cette disquette dans l'autre. Cette copie peut être
faite avec n'importe quel copieur (même DiskCopy). La piste
endommagée ne sera pas copiée dans ce cas mais sera mise à zéro.
C'est là que le Disk Fixer entre en action.
J'ai essayé dans la mesure du possible de rendre ce programme
accessible à tous, même sans savoir ni comprendre ce que je vais essayer
d'expliquer. Ces explications ne sont là que pour pallier une éventuelle
défaillance du programme, afin que l'utilisateur puisse faire la
réparation lui-même le cas échéant. Elles ne sont pas vraiment
indispensables dans la mesure où l'incompréhension du tableau d'analyse
n'exclut nullement une réparation de la disquette, même par un débutant
(menu Réparer).
Qu'est-ce qu'une piste brute (Raw Track)?
Il y a deux niveaux de visualisation de la disquette. Le premier est
celui que vous obtenez en utilisant un éditeur de disquette (Mirror Hack,
DiskWik, NewZap, etc...). Pour des raisons matérielles, il n'est pas
possible d'écrire directement ces données telles quelles sur la disquette,
car le drive ne pourrait plus les relire. Il faut donc les coder avant de
les écrire. Le système de codage employé par l'Amiga est le MFM. Je ne
vais pas m'étendre là-dessus car cela ne présente pas d'intérêt pour le
présent sujet. Ce codage revient finalement à doubler la taille des
données. Autrement dit, un secteur, qui fait 512 octets, sera codé en
1024. En fait, il y en a plus, car il faut faire précéder ces données d'un
tas d'informations afin que le Dos s'y retrouve. Il y donc deux champs sur
une Raw Track: champ Header et champ Data.
Le champ Header:
Octets avant synchronisation: AAAA AAAA
Deux mots de synchronisation: 4489 4489
Partie info (voir plus bas): xxxx xxxx xxxx xxxx
Partie inutilisée: 16 * xxxx
Checksum header: xxxx xxxx xxxx xxxx
Checksum data: xxxx xxxx xxxx xxxx
-------------------
32 mots
Le champ Data:
Datas: 1024 octets (512 mots)
Donc, la longueur totale d'une piste (en octets) est
(64 + 1024) * 11 = 11968 ($2ec0)
A cela il faut rajouter l'intervalle de piste (gap) dont la longueur
est variable (environ $2b8).
Total: environ $3178 octets ($18bc mots)
La partie info du champ Header contient plus de précision à propos de
ce qu'on va trouver: par exemple, on pourrait lire (une fois décodé. Le
même codé prendrait 4 mots au lieu de 2)
Info: ff0b0305
Avec respectivement
- ff: Identificateur de format (toujours $ff pour Amiga)
- 0b: Numéro de piste. Attention: en fait il s'agit de la piste
multipliée par deux plus la tête. Ainsi, ici, c'est la piste 5,
tête 1
- 03: Numéro de secteur
- 05: Nombre de secteurs avant d'atteindre l'intervalle de piste
Ces précisions étant faites, voyons ce que fait le Disk Fixer.
Ce que fait le Disk Fixer
Tout d'abord, il permet d'analyser une piste en affichant un tableau
qui pourrait ressembler à celui-ci:
Analyse de la piste 5 tete 1
Header Etat Chk. lu Etat Chk. lu Etat
--------- ---- ---------- ---- --------- ----
ff0b000b OK 40004 OK 51544551 OK
ff0b010a OK 40105 OK 45044440 OK
ff0b0209 OK 40105 OK 1041514 OK
ff0b0308 OK 40004 OK 55110504 OK
ff0b0407 OK 40404 OK 11114411 OK
ff0b0506 OK 40505 OK 11554441 OK
ff0b0605 OK 40505 OK 54441451 OK
ff0b0704 OK 40404 OK 11501501 OK
ff0b0803 OK 40400 OK 54041401 OK
ff0b0902 OK 40501 OK 44401000 OK
ff0b0a01 OK 40501 OK 4015505 OK
Longueur: 315e
A la lumière des explications précédentes, la signification de tout
ceci devrait être évidente: dans le champ "Header" se trouve le décodage
de la partie info, dans la partie "Chk.lu" des deux champs se trouve la
valeur du checksum qui est écrite sur la disquette, et la colonne "Etat"
vous donne le résultat de la comparaison de cette valeur lue avec celle
que le programme a calculée lui-même (si ces deux ne sont pas égales, vous
aurez un "**" à la place de "OK").
Comment savoir si la piste est réparable?
Les affichages suivants indiquent des données que l'on peut
récupérer:
Header Etat Chk. lu Etat Chk. lu Etat
--------- ---- ---------- ---- --------- ----
aa0b000b ** 40004 OK 51544551 OK
12340178 ** 40105 OK 45044440 OK
ff0b0209 OK 40105 ** 1041514 OK
ff0b0308 OK 40004 OK 55110504 **
ff0b0407 OK 40404 OK 11114411 OK
ff0b0506 OK 40505 OK 11554441 OK
ff0b0605 OK 40505 OK 54441451 OK
ff0b0704 OK 40404 OK 11501501 OK
ff0b0803 OK 40400 OK 54041401 OK
ff0b0902 OK 40501 OK 44401000 OK
ff0b0a01 OK 40501 OK 4015505 OK
Seuls les 4 premiers secteurs sont en mauvais état. Or les mauvaises
valeurs peuvent être recalculées facilement:
- pour la partie info, Disk Fixer ignore simplement ce qu'il lit et
reconstitue lui-même l'identificateur de secteur ($12 -> $ff), le numéro
de piste ($34 -> $0b), et l'intervalle de piste ($78 -> $0a). Remarquez
que dans la version actuelle, il ne tente pas de réparer le numéro de
secteur. Pour vous, il est facile de voir que celui qui manquerait serait
$01 (ça part de 0 et ça croît jusqu'à $0a), car ici c'est simple. Mais
imaginez une piste dans laquelle les numéros seraient 3, 8, 4, 1, ??, 7,
etc... ça devient beaucoup plus dur de déterminer lequel manque. Et je
laisse volontairement de côté le cas où des numéros se retrouvent
plusieurs fois: comment savoir lequel on doit choisir? Ici, c'est à
l'utilisateur d'analyser la piste et de la modifier en recodant les
données qu'il aura calculées (la version 2.0 de df ne permet pas de
modifier le buffer, seulement de le visualiser. Une version future le
permettra, et pourra vraisemblablement calculer dans le mesure où c'est
possible, le secteur manquant)
- pour la partie checksum, le calcul se fait simplement (suite de XOR
principalement), et il est facile de récrire un checksum correct (de la
même façon que précédemment, df ignore le checksum lu et écrit celui qu'il
a calculé)
En revanche, il y a fort à parier qu'une piste ayant le schéma
suivant soir irrémédiablement perdue:
Analyse de la piste 0 tete 1
Header Etat Chk. lu Etat Chk. lu Etat
--------- ---- ---------- ---- --------- ----
ff010407 OK 10404 OK 40001555 OK
ff010506 OK 10505 OK 10514400 OK
ff010605 OK 10505 OK 40044414 OK
ff010704 OK 10404 OK 14540451 OK
ff010803 OK 10400 OK 4540455 OK
ff010902 OK 10501 OK 50441144 OK
ff010a01 OK 10501 OK 44145010 OK
ffffffff ** ffffffff ** ffffffff **
fff23815 ** 303e000c ** 10000004 **
234c2f7c ** 15bc2200 ** a80abc **
220 ** a29 ** 18 **
Longueur: 315c
Ici, le carnage est évident: plus de la moitié de la piste ne peut
pas être analysée, car df n'a même pas trouvé les bits de synchronisation
($44894489). Si vous essayez de réparer une telle piste, il y a fort à
parier que df en sera incapable et qu'il formattera la piste destination.
Description de l'utilisation de Disk Fixer
Au départ, vous verrez trois fenêtres s'ouvrir: l'une pour afficher
le tableau d'analyse, l'autre est une grille pour savoir sur quelle piste
on se trouve et lesquelles on a déjà analysées, et la dernière est une
petite fenêtre dans laquelle apparaissent des messages divers.
Il y peu de menus et ceux-ci sont explicites:
- Analyse:
Vous pouvez ainsi analyser le buffer de la piste courante, lire une
piste que vous précisez, lire la piste suivante, la précédente ou encore
relire la présente, et remettre la grille à zéro.
- Analyse du buffer:
Un nouveau menu apparaît. Il vous permet de décoder en MFM les deux
mots longs à partir du curseur (c'est-à-dire celui qui est encadré, et le
suivant). Le résultat du décodage s'affiche en titre de la fenêtre. Vous
pouvez également calculer le checksum du Header (c'est-à-dire des 64
octets à partir du curseur) ou du champ Data (1024 octets).
Pour vous déplacer dans le buffer, vous disposez des commandes
suivantes:
* Sur le pavé numérique, 2 4 6 8 pour vous déplacer d'un mot long (ou
les flèches)
* 3 et 9 pour avancer d'une page
* ESC pour quitter la visualisation
- Réparation:
C'est une opération dangereuse car elle risque de détruire la
disquette destination. Faites donc bien attention. Vous pouvez réparer
soit une piste unique (celle qui est affichée) soit un intervalle de
piste, auquel cas les bornes vous sont demandées.
L'esprit de Disk Fixer est d'obtenir quel que soit le résultat une
disquette destination entièrement lisible à l'arrivée (du moins, sur les
pistes traitées). Ainsi, s'il n'arrive pas à récrire une piste
correctement, il formattera la piste destination (vous serez prévenu par
un 'F' dans la grille). Je ne sais pas si c'est une bonne chose. A vous de
m'en faire part.
Signification des lettres inscrites sur la grille:
'.' Ecriture fidèle réussie 'L' Lecture en cours
'E' Ecriture en cours 'F' Piste formattée
'V' Vérification en cours '?' Erreur de formattage
- Sélection des drives:
Pas de commentaire, si ce n'est qu'un flash vous avertira de
l'interdiction de sélection de tel ou tel drive.
Améliorations possibles dans le futur
- Autoriser la modification du buffer par l'utilisateur, et que le nouveau
buffer puisse être écrit sur la disquette
- Toujours dans l'analyse du buffer, fournir tous les outils nécessaires
pour faire le codage dans les deux sens (pour l'instant, seul le MFM ->
Normal est fait). Par exemple, l'utilisateur pourra rentrer ff0b0102 et le
programme se chargera de coder ceci comme il faut, et de recalculer le
checksum
- Nouvelles fonctions de déplacement (début, fin, etc...)
- Autorisation d'utiliser un seul drive, et donc interruption pour
demander à l'utilisateur d'insérer la disquette destination
(éventuellement, prévoir que les disquettes source et destination puissent
être identiques, encore que cela soit tellement dangereux que je n'en vois
pas l'intérêt. J'y réfléchirai).
Remerciements
- La totalité de Disk Fixer est écrite en C (sauf trois lignes en
Assembleur), et plus précisément avec le Lattice 5.0. Grand merci à
l'éditeur LSE et au superbe - quoiqu'un peu gourmand gourmand en mémoire -
debugger CPR
- Un grand merci à Power Windows (enfin, ses auteurs) sans lequel le
travail avec Intuition ne serait pas ce qu'il est. Il est d'ailleurs
probable que sans PW la version 2.0 n'aurait jamais vu le jour (la version
1.0 était une banale fonction CLI). Mais il y a un bug dans PW dès qu'on
veut ouvrir une quatrième fenêtre lors de la génération de code. Résultat:
j'ai dû utiliser deux fichiers de génération.
- Une offrande particulière au gurubuster GOMF 3.0 qui n'a pas chômé
pendant l'écriture de ce programme!
- Remerciements aux testeurs éclairés qui font que ce programme génial
est devenu un programme sublimement génial: Cédric Nérot, Ludwig Neumann,
Bruce Lepper, Jean-Charles Godien, etc...
J'espère sincérement que ce programme sera utile.
N'hésitez pas à me joindre pour m'adresser vos remarques:
Cédric BEUST
'Prométhée'
80, Av. du Bois de Cythère
06000 NICE
Tél. 93 96 00 23
--- Nouvelles versions
2.1 (3 Novembre 1989):
Dans la forme, peu de changements, si ce n'est le numéro de version. En
revanche, j'ai récrit toutes les routines concernant l'analyse du
buffer (longueur, calcul du checksum, réparation, etc...) en
Assembleur. C'est ce que j'aurais dû faire dès le début car j'ai
directement recopié les routines de la ROM. J'ai également simplifié
l'affichage des messages dans la fenêtre (plus de longueur ni de type
d'erreur. Une idée qui me trotte dans la tête pour une version future:
ajouter une option "vérifier la disquette"). Enfin, j'ai quelque peu
amélioré l'algorithme de réparation qui est légèrement plus efficace
que le précédent.